home *** CD-ROM | disk | FTP | other *** search
Wrap
# ########################################################################## # # PurePak - The sequel to TextBox # # A -+ TEXT +- production # # ########################################################################## # # Author: Crypt Keeper [ckeeper@axiom.access.one.net] (CKeeper on IRC) # Version 2.07 # # This script requires at least ircII2.2.9 (Unix) or a fully ircII compatible # client. It has only been tested under Unix with ircII2.2.9 and ircII2.8.2. # # If you edit this file, you must edit it with a Unix text editor or use # utilities like dos2unix/unix2dos to convert it to DOS to edit and then # back to Unix. If it is edited in a DOS text editor it will be corrupted. # # PurePak version 2.07 IRC script # Copyright (C) 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 1, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ########################################################################## # EVAL ^if (!(PPVERS)) {/echo *** This is not a stand-alone script, it must be loaded after purepak.irc;//exit} # DCC fileserver/manager script @ PP.DCC = 1 # ---------------------------------------------------------------------------- # DCC alias # ---------------------------------------------------------------------------- alias xdcc {/dcc $*} alias dcc { if ([$0]) { if (match($0 SEND GET RAW TALK CHAT OFFER DOFFER LIST PLIST NOTICE DLDIR FRIENDS AUTOGET LOAD SAVE CLOSE LIMIT RENAME TMSG NOTE SERVER TIMEOUT QUEUEING PUBLIST AUTOCHAT)) { if (match($0 RAW TALK RENAME TMSG SEND CHAT)) {//dcc $*} if (match($0 CLOSE OFFER DOFFER LIST PLIST NOTICE DLDIR AUTOGET FRIENDS LOAD SAVE GET LIMIT NOTE SERVER TIMEOUT QUEUEING PUBLIST AUTOCHAT)) {/dcc.ucmd.$0 $1-} } {/echo *** Unrecognized DCC command, type /pphelp dcc} } { if (!PP.EPIC) { dcc.updatestatus @ GDCCS = 0 if (DCC.GETS) { @ GDCCS = 1 echo *** Incoming files: From Status Read Filename foreach DCC.GETS AA { EVAL ^foreach DCC.GETS.$AA XY { @ NK = decode($AA) if (word(0 $DCC.GETS[$AA][$XY]) == [W]) {@ ST = [Waiting]} {@ ST = [In Progress]} @ BT = word(2 $DCC.GETS[$AA][$XY]) echo *** $[9]NK $[11]ST $[10]BT $right(24 $decode($XY)) } } } if (DCC.SENDS) { @ GDCCS = 1 echo *** Outgoing files: To Status Written Filename foreach DCC.SENDS AA { EVAL ^foreach DCC.SENDS.$AA XY { @ NK = decode($AA) if (word(0 $DCC.SENDS[$AA][$XY]) == [W]) {@ ST = [Waiting]} {@ ST = [In Progress]} @ BT = word(1 $DCC.SENDS[$AA][$XY]) echo *** $[9]NK $[11]ST $[10]BT $right(24 $decode($XY)) } } } if (DCC.CHATS) { foreach DCC.CHATS AA { if (word(0 $DCC.CHATS[$AA]) == [W]) {/echo *** DCC CHAT request to $decode($AA) not established (waiting)} if (word(0 $DCC.CHATS[$AA]) == [O]) {/echo *** DCC CHAT offered from $decode($AA)} if (word(0 $DCC.CHATS[$AA]) == [A]) {/echo *** DCC CHAT active to $decode($AA)} } @ GDCCS = 1 } if (GDCCS) {^assign -XY} {/echo *** No active DCC CHAT, SEND, or GET connections} ^assign -GDCCS } {//dcc} } } EVAL ^if (!PP.SET.DCCDLDIR) {@ PP.SET.DCCDLDIR = [.]} EVAL ^if (!PP.SET.DCCAUTOGET) {@ PP.SET.DCCAUTOGET = [OFF]} EVAL ^if (!PP.SET.DCCFLAUTOGET) {@ PP.SET.DCCFLAUTOGET = [ON]} EVAL ^if (!PP.SET.DCCLIMIT) {@ PP.SET.DCCLIMIT = [-1]} EVAL ^if (!PP.SET.DCCSERVER) {@ PP.SET.DCCSERVER = [ON]} EVAL ^if (!PP.SET.DCCTIMEOUT) {@ PP.SET.DCCTIMEOUT = 90} EVAL ^if (!PP.SET.DCCPUBLIST) {@ PP.SET.DCCPUBLIST = [ON]} EVAL ^if (!PP.SET.DCCQUEUEING) {@ PP.SET.DCCQUEUEING = [ON]} EVAL ^if (!PP.SET.DCCAUTOCHAT) {@ PP.SET.DCCAUTOCHAT = [OFF]} # ---------------------------------------------------------------------------- # /dcc functions # ---------------------------------------------------------------------------- # /dcc autochat alias dcc.ucmd.autochat { if (match($0 ON OFF)) {@ PP.SET.DCCAUTOCHAT = toupper($0)} echo *** Auto accept DCC CHAT requests is now ${PP.SET.DCCAUTOCHAT} } # /dcc queueing alias dcc.ucmd.queueing { if (match($0 ON OFF)) {@ PP.SET.DCCQUEUEING = toupper($0)} echo *** Queueing of send requests if all slots are full is now ${PP.SET.DCCQUEUEING} } # /dcc server alias dcc.ucmd.server { if (match($0 ON OFF)) {@ PP.SET.DCCSERVER = toupper($0)} echo *** DCC server is now ${PP.SET.DCCSERVER} } # /dcc publist alias dcc.ucmd.publist { if (match($0 ON OFF)) {@ PP.SET.DCCPUBLIST = toupper($0)} echo *** Allow public CTCP XDCC LISTs is now ${PP.SET.DCCPUBLIST} } # /dcc note alias dcc.ucmd.note { if ([$0]) {^if ([$0] != [-]) {@ DCC.NOTE = [$*]} {^assign -DCC.NOTE}} if (DCC.NOTE) {/echo *** DCC offer list note: $DCC.NOTE} {/echo *** No DCC offer list note set} } # /dcc notice alias dcc.ucmd.notice { if (C) { EVAL @ SEND_MSG = [ACTION - Files offered: Type /msg $N xdcc list for a list.] ^pp.listmsg PRIVMSG $mychannels() ^assign -SEND_MSG echo * $N - Files offered! Type /msg $N xdcc list for a list. } {/echo *** You aren't on any channels} } # /dcc offer alias dcc.ucmd.offer { ^input "Enter filename(s) to offer: " if (1) { if ([$0]) { @ IDX = 0 while (word($IDX $*)) { if (fileexists($word($IDX $*))) {@ DCCFILS = DCCFILS##[$word($IDX $*) ]} {/echo *** File $word($IDX $*) does not exist or you have no permission to access} @ IDX = IDX + 1 } if (DCCFILS) { ^input "Enter a description for this pack: " if (1) { if ([$0]) { @ IDX = 1 while (DCCPACKS.FILES[$IDX]) {@ IDX = IDX + 1} @ DCCPACKS.FILES[$IDX] = DCCFILS @ DCCPACKS.DESC[$IDX] = [$*] @ DCCPACKS.STATS[$IDX] = [$W 0] echo *** Pack #$IDX added with files: ${DCCFILS} ^assign -IDX ^assign -DCCFILS } { ^assign -IDX ^assign -DCCFILS echo *** You must enter a description } } } { ^assign -IDX echo *** No files in pack! } } {/echo *** No files in pack!} } } # /dcc doffer alias dcc.ucmd.doffer { ^input "Enter pack number(s) to remove: " if (1) { if ([$0]) { @ AA = 0 while (word($AA $*)) { if (DCCPACKS.FILES[$word($AA $*)]) { ^assign -DCCPACKS.FILES[$word($AA $*)] ^assign -DCCPACKS.DESC[$word($AA $*)] ^assign -DCCPACKS.STATS[$word($AA $*)] @ CTR = word($AA $*) + 1 while (DCCPACKS.FILES[$CTR]) { @ DCCPACKS.FILES[${CTR-1}] = DCCPACKS.FILES[$CTR] @ DCCPACKS.DESC[${CTR-1}] = DCCPACKS.DESC[$CTR] @ DCCPACKS.STATS[${CTR-1}] = DCCPACKS.STATS[$CTR] if (!(DCCPACKS.FILES[${CTR+1}])) { ^assign -DCCPACKS.FILES[$CTR] ^assign -DCCPACKS.DESC[$CTR] ^assign -DCCPACKS.STATS[$CTR] } @ CTR = CTR + 1 } echo *** Pack #$word($AA $*) removed } {/echo *** There is no pack #$word($AA $*)} @ AA = AA + 1 } ^assign -CTR } } } # /dcc list alias dcc.ucmd.list { if (dcc.havepacks()) { if (PP.SET.DCCLIMIT > 0) {/echo *** Files offered: [${PP.SET.DCCLIMIT-DCC.NSENDING} slots available]} {/echo *** Files offered:} dcc.dolist 1 echo *** } {/echo *** You have no files offered} } # /dcc save alias dcc.ucmd.save { if ([$0]) { @ LF = [$0] exec -name rm $PP.SET.RMCMD $0 wait -CMD %rm if (1) { if (PP.EPIC) { @ FHANDLE = open($LF w) if (FHANDLE > 0) {/EVAL ^assign WC /write $FHANDLE} {/echo *** Could not open $LF} } { ^window new ^window hold_mode off ^window name WRITEDCC ^window logfile $LF ^window log on @ WC = [/xecho -WINDOW WRITEDCC] } $WC # PurePak DCC module offer file, written $stime($time()) foreach DCCPACKS.FILES AA { @ CT = 0 @ DFILES = [] while (word($CT $DCCPACKS.FILES[$AA])) { if (match(/* $word($CT $DCCPACKS.FILES[$AA]))) {@ DFILES = DFILES##[$word($CT $DCCPACKS.FILES[$AA]) ]} {@ DFILES = DFILES##[$word(0 $DCCPACKS.STATS[$AA])/$word($CT $DCCPACKS.FILES[$AA]) ]} @ CT = CT + 1 } $WC ^dcc.addpack $encode($DFILES) $encode($DCCPACKS.DESC[$AA]) } ^assign -CT ^assign -DFILES if (DCC.NOTE) {$WC ^dcc.ucmd.note $DCC.NOTE} if (PP.EPIC) { comment $close($FHANDLE) ^assign -FHANDLE } { ^window log off ^window kill } echo *** Current pack data written to $LF ^assign -LF ^assign -WC } } {/dcc.ucmd.save purepak.dcc} } # /dcc load alias dcc.ucmd.load {^if ([$0]) {//load $0} {//load purepak.dcc}} # /dcc plist alias dcc.ucmd.plist { if (dcc.havepacks()) { say Files offered: Type /msg $N xdcc send #N to get pack #N if (PP.SET.DCCLIMIT > 0) {/say [${PP.SET.DCCLIMIT-DCC.NSENDING} slots available]} dcc.dolist 0 say } {/echo *** You have no files offered} } # /dcc dldir alias dcc.ucmd.dldir { if ([$0]) { @ PP.SET.DCCDLDIR = [$0] echo *** DCC download directory is now $0 } {/echo *** DCC download directory is now ${PP.SET.DCCDLDIR}} } # /dcc limit alias dcc.ucmd.limit { if ([$0]) { if (([$0] == [NONE])||([$0] == [OFF])) {@ PP.SET.DCCLIMIT = [-1]} { if (!isalpha($0)) {@ PP.SET.DCCLIMIT = [$0]} {/echo *** Must be a numerical value} } } if (PP.SET.DCCLIMIT == [-1]) {/echo *** DCC autosend file limit is now UNLIMITED} {/echo *** DCC autosend file limit is now ${PP.SET.DCCLIMIT}} } # /dcc limit alias dcc.ucmd.timeout { if ([$0]) { if (([$0] == [NONE])||([$0] == [OFF])) {@ PP.SET.DCCTIMEOUT = [-1]} { if (!isalpha($0)) {@ PP.SET.DCCTIMEOUT = [$0]} {/echo *** Must be a numerical value} } } if (PP.SET.DCCTIMEOUT == [-1]) {/echo *** DCC autosend timeout is now UNLIMITED} {/echo *** DCC autosend timeout is now ${PP.SET.DCCTIMEOUT}} } # /dcc autoget alias dcc.ucmd.autoget { if (match($0 ON OFF)) {@ PP.SET.DCCAUTOGET = toupper($0)} echo *** DCC autoget is now ${PP.SET.DCCAUTOGET} } # /dcc friends alias dcc.ucmd.friends { if (match($0 ON OFF)) {@ PP.SET.DCCFLAUTOGET = toupper($0)} echo *** DCC autoget from people in friends list is now ${PP.SET.DCCFLAUTOGET} } # /dcc get alias dcc.ucmd.get { if ([$0]) { if ([$1]) { @ AA = 1 ^on ^window "% *No file offered in SEND*" {@ AA = 0} //dcc get $0 $1 if (!AA) {/echo *** File $1 not offered by $0} } { if ([$0]) { dcc.updatestatus @ FL = 0 foreach DCC.GETS AA { if (toupper($decode($AA)) == toupper($0)) { @ FL = 1 EVAL foreach DCC.GETS.$AA XY {//dcc get $0 $decode($XY)} ^assign -XY echo *** Got all files offered by $0 } } if (!FL) {/echo *** No files offered by $0} ^assign -FL } { dcc.updatestatus if (DCC.GETS) { foreach DCC.GETS AA { EVAL foreach DCC.GETS.$AA XY {//dcc get $decode($AA) $decode($XY)} ^assign -XY } } {/echo *** No files offered} } } } {/echo *** /dcc get [<nick>] [<file>]} } # /dcc close alias dcc.ucmd.close { if (match($0 RAW TALK CHAT RAW_LISTEN RAW_LIS)) {//dcc close $*} { @ AA = 0 if ([$0] == [SEND]) { if ([$1]) { if (DCC.NSENDING > 0) {@ DCC.NSENDING = DCC.NSENDING - 1} if ([$2]) {//dcc close $*} { EVAL ^repeatcmd 30 //^dcc close send $1 echo *** All DCC SENDs to $1 closed } } {/echo *** /dcc close send <nick> [<file>]} @ AA = 1 } if ([$0] == [GET]) { if ([$1]) { if ([$2]) {//dcc close $*} { EVAL ^repeatcmd 30 //^dcc close get $1 echo *** All DCC GETs from $1 closed } } {/echo *** /dcc close get <nick> [<file>]} @ AA = 1 } if (!AA) {/echo *** /dcc close <type> <nick> [<arguments>]} } } # ---------------------------------------------------------------------------- # ON hooks and internal procedures # ---------------------------------------------------------------------------- on ^ctcp "% % DCC SEND % % % *" { if (([$6] > 1024)&&([$6] < 65535)) { if (!ischannel($1)) { if ((!!(PP.SET.DCCDLDIR))&&(PP.SET.DCCDLDIR != [.])) {//dcc rename $0 $4 ${PP.SET.DCCDLDIR}/$4} if (PP.SET.DCCAUTOGET == [ON]) { echo *** Autogetting DCC SEND $4 from $0 ^timer 2 //dcc get $0 $4 } { if (PP.SET.DCCFLAUTOGET == [ON]) { foreach PP.FRIENDS AA {@ FNDS = FNDS##[ $PP.FRIENDS[$AA]]} if (rmatch($0!$USERHOST() $FNDS)) { echo *** Autogetting DCC SEND $4 from $0\; $0 is on your friends list //dcc get $0 $4 } ^assign -FNDS } } } {/echo *** Strange: $0 sent a DCC SEND request adressed to channel $1} } { ^timer 1 /echo *** DCC SEND request from $0 using priviledged port detected\; ignored (bomb?) //dcc close get $0 $4 } } on ^ctcp "% % DCC CHAT % % *" { if (([$6] < 1024)||([$6] > 65535)) { ^timer 1 /echo *** DCC CHAT request from $0 using priviledged port detected\; ignored (bomb?) //dcc close chat $0 //dcc close chat $0 } { if (PP.SET.DCCAUTOCHAT == [ON]) { ^timer 1 /echo *** Autogetting DCC CHAT request from $0 //dcc chat $0 } { if (PP.SET.DCCFLAUTOGET == [ON]) { foreach PP.FRIENDS AA {@ FNDS = FNDS##[ $PP.FRIENDS[$AA]]} if (rmatch($0!$USERHOST() $FNDS)) { ^timer 1 /echo *** Autogetting DCC CHAT request from $0\; $0 is on your friends list //dcc chat $0 } ^assign -FNDS } } } } # We use a raw_irc for on msg to prevent a beep if BEEP_ON_MSG is set on ^raw_irc "% PRIVMSG % :XDCC *" { if (!ischannel($2)) { if (PP.SET.DCCSERVER == [ON]) {/dcc.msg $nickonly($0) $N $mid(${index(! $0)+1} 1000 $0) $4-} } { if ([$2] == C) {/xecho -LEVEL PUBLIC <$nickonly($0)> $strip(: $3) $4-} {/xecho -LEVEL PUBLIC <$nickonly($0):$2> $strip(: $3) $4-} } } on ^ctcp "% % XDCC *" {^if (PP.SET.DCCSERVER == [ON]) {/dcc.msg $0 $1 $USERHOST() $3-}} alias dcc.msg { if (right(10 $2) != LASTDCCER) { if (ischannel($1)) { if (match($3 SEND LIST HELP VERSION LSPACK)) { if ([$3] == [LIST]) { if (PP.SET.DCCPUBLIST == [ON]) { if (dcc.havepacks()) {/dcc.msg $0 $N $2-} } {/echo *** $0 request for DCC LIST to everyone in $1 ignored} } { echo *** $0 request for DCC $toupper($3) to everyone in $1 ignored\; only LIST is allowed globally //^notice $0 Only DCC LISTs are allowed globally } } { echo *** Invalid DCC server command from $0 to $1 //^notice $0 Unknown DCC server command\; type /msg $N XDCC HELP } } { if (match($3 SEND LIST HELP VERSION LSPACK)) {/dcc.mcmd.$3 $0 $2 $4-} { echo *** Invalid DCC server command from $0 //^notice $0 Unknown DCC server command\; type /msg $N XDCC HELP } } } if (!LASTDCCER) {^timer 3 ^assign -LASTDCCER} @ LASTDCCER = right(10 $2) } # Updates DCC status variables by capturing /dcc's output # Doesn't work on EPIC clients :P alias dcc.updatestatus { ^on ^window "% Type*Nick*Status*Start*time*Sent*Read*Arguments*" {} ^on ^window "% SEND *" { if ([$3] == [Waiting]) {@ DCC.SENDS[$encode($2)][$encode($6)] = [W $4 $5]} {@ DCC.SENDS[$encode($2)][$encode($10)] = [A $8 $9]} @ DCC.SENDS = 1 } ^on ^window "% GET *" { if ([$3] == [Offered]) {@ DCC.GETS[$encode($2)][$encode($6)] = [W $4 $5]} {@ DCC.GETS[$encode($2)][$encode($10)] = [A $8 $9]} @ DCC.GETS = 1 } ^on ^window "% RAW *" {} ^on ^window "% CHAT *" { if ([$3] == [Waiting]) {@ DCC.CHATS[$encode($2)] = [W $4 $5]} { if ([$3] == [Offered]) {@ DCC.CHATS[$encode($2)] = [O $4 $5]} {@ DCC.CHATS[$encode($2)] = [A $8 $9]} } @ DCC.CHATS = 1 } ^on ^window "% RAW_LIS *raw_listen*" {} ^on ^window "% TALK *" {} foreach DCC.SENDS AA {/EVAL ^foreach DCC.SENDS.$AA BB {^assign -DCC.SENDS[$AA][$BB]}} foreach DCC.GETS AA {/EVAL ^foreach DCC.GETS.$AA BB {^assign -DCC.GETS[$AA][$BB]}} foreach DCC.CHATS AA {^assign -DCC.CHATS[$AA]} ^assign -DCC.SENDS ^assign -DCC.GETS ^assign -DCC.CHATS ^assign -BB //dcc ^on window - "% TALK *" ^on window - "% CHAT *" ^on window - "% RAW *" ^on window - "% GET *" ^on window - "% RAW_LIS *raw_listen*" ^on window - "% Type*Nick*Status*Start*time*Sent*Read*Arguments*" ^on window - "% SEND *" } # Executed when a saved pack file loads alias dcc.addpack { @ FILZ = decode($0) @ AA = 0 while (word($AA $FILZ)) { if (!fileexists($word($AA $FILZ))) { ^delword $word($AA $FILZ) $FILZ echo *** LOAD: file $word($AA $FILZ) does not exist, removed from pack @ FILZ = NLIST ^assign -NLIST } @ AA = AA + 1 } if ([$#FILZ] > 0) { @ IDX = 1 while (DCCPACKS.FILES[$IDX]) {@ IDX = IDX + 1} @ DCCPACKS.FILES[$IDX] = FILZ @ DCCPACKS.DESC[$IDX] = decode($1) @ DCCPACKS.STATS[$IDX] = [$W 0] echo *** Pack #$IDX loaded with files: $FILZ echo *** - Description: $decode($1) ^assign -IDX } {/echo *** Pack not restored: no files} ^assign -FILZ } # Executed whenever the user changes nicks with /nick alias dcc.onnick { if ([$0]) { @ DCC.MYNICK = [$0] EVAL ^on raw_irc - "${N}!% PRIVMSG $N :DCC SEND **" EVAL ^on ^raw_irc "$0!% PRIVMSG $0 :DCC SEND **" { @ DCC.SINT.FNAME = [$5] @ DCC.SINT.FSIZE = strip( $8) //^dcc close send $N //^dcc close get $N $DCC.ONREPCMD } } } EVAL ^on ^raw_irc "${N}!% PRIVMSG $N :DCC SEND **" { @ DCC.SINT.FNAME = [$5] @ DCC.SINT.FSIZE = strip( $8) //^dcc close send $N //^dcc close get $N $DCC.ONREPCMD } @ DCC.ONREPCMD = [/dcc.norepcmd] alias dcc.norepcmd { @ DCC.FSIZES[$encode($tolower($DCC.SINT.FNAME))] = DCC.SINT.FSIZE ^assign -DCC.SINT.FNAME ^assign -DCC.SINT.FSIZE } # Checks to see if a file exists by trapping window output from a DCC SEND # to yourself. alias fileexists { @ EXISTS = 1 ^on ^window "% *Cannot access*" {@ EXISTS = 0} ^on ^window * {} //dcc send $N $0 ^on window - "% *Cannot access*" ^on window - * @ FUNCTION_RETURN = EXISTS ^assign -EXISTS } # args=<files>, returns sum of all file sizes, or 0 if a file's size isn't # saved in the buffer alias dcc.getpacksize { @ PSIZE = 0 @ CT = 0 while ((!!word($CT $*))&&(PSIZE != [-1])) { @ FN = dcc.nameonly($word($CT $*)) if (DCC.FSIZES[$encode($tolower($FN))]) { @ PSIZE = PSIZE + DCC.FSIZES[$encode($tolower($FN))] } {@ PSIZE = [-1]} @ CT = CT + 1 } ^assign -CT ^assign -FN if (PSIZE == [-1]) {@ FUNCTION_RETURN = 0} {@ FUNCTION_RETURN = PSIZE} ^assign -PSIZE } # /dcc.dolist <show filenames too?> <command to do list> alias dcc.dolist { @ MAXV = 0 foreach DCCPACKS.FILES AA {^if (AA > MAXV) {@ MAXV = AA}} @ AA = 0 while (AA <= MAXV) { if (DCCPACKS.FILES[$AA]) { $1- #${AA} - $DCCPACKS.DESC[$AA] @ FILS = DCCPACKS.FILES[$AA] EVAL $1- + [$#FILS file(s)] [$dcc.getpacksize($FILS) bytes] [downloaded $word(1 $DCCPACKS.STATS[$AA]) times] if ([$0]) {$1- #${AA} - Files: $FILS} } @ AA = AA + 1 } ^assign -FILS ^assign -MAXV if (DCC.NOTE) {$1- * Note: $DCC.NOTE} } # Returns true if you have files offered alias dcc.havepacks { @ FUNCTION_RETURN = 0 foreach DCCPACKS.FILES BB {@ FUNCTION_RETURN = 1} ^assign -BB } # Queues a send for the timeout timer alias dcc.queuetimeout {@ DCC.TIMEOUTS[$encode($0)][$rand(99999)] = [$1 $2 $3]} # Checks for DCC's that have timed out and runs queued DCC's on #^timer 22 * { if (PP.SET.DCCTIMEOUT != [-1]) { foreach DCC.TIMEOUTS AA { EVAL ^foreach DCC.TIMEOUTS.$AA BB { if ([${time() - word(1 $DCC.TIMEOUTS[$AA][$BB])}] >= PP.SET.DCCTIMEOUT) { //^dcc close send $decode($AA) $word(2 $DCC.TIMEOUTS[$AA][$BB]) //^dcc close send $decode($AA) ${W}/$word(0 $DCC.TIMEOUTS[$AA][$BB]) if (DCC.NSENDING > 0) {@ DCC.NSENDING = DCC.NSENDING - 1} echo *** DCC SEND $word(2 $DCC.TIMEOUTS[$AA][$BB]) to $decode($AA) timed out //^notice $decode($AA) DCC SEND $word(2 $DCC.TIMEOUTS[$AA][$BB]) timed out ^assign -DCC.TIMEOUTS[$AA][$BB] } } } } if (PP.SET.DCCLIMIT != [-1]) { while (dcc.gotqueue()) { @ BB = 0 @ OLDESTQUEUE = 0 foreach DCC.SENDQUEUE AA { if ([${time() - AA}] > BB) { @ BB = time() - AA @ OLDESTQUEUE = AA } } echo *** Sending queued pack #$strip(# $word(2 $DCC.SENDQUEUE[$OLDESTQUEUE])) to $word(0 $DCC.SENDQUEUE[$OLDESTQUEUE]) ^alias echo {} ^dcc.mcmd.send $DCC.SENDQUEUE[$OLDESTQUEUE] ^alias -echo ^assign -DCC.SENDQUEUE[$OLDESTQUEUE] } ^assign -OLDESTQUEUE } { foreach DCC.SENDQUEUE AA { echo *** Sending queued pack #$strip(# $word(2 $DCC.SENDQUEUE[$AA])) to $word(0 $DCC.SENDQUEUE[$AA]) ^alias echo {} ^dcc.mcmd.send $DCC.SENDQUEUE[$AA] ^alias -echo ^assign -DCC.SENDQUEUE[$AA] } } ^assign -BB } # Returns true if files are queued and there are slots available alias dcc.gotqueue { @ FUNCTION_RETURN = 0 foreach DCC.SENDQUEUE AB {^if (DCC.NSENDING < PP.SET.DCCLIMIT) {@ FUNCTION_RETURN = 1}} ^assign -AB } # Removes timeouts when sends are initiated on -window "% % DCC SEND connection to*established*" { if (match(*[* $6)) {@ NIQ = left($index([ $6) $6)} {@ NIQ = [$6]} foreach DCC.TIMEOUTS AA {^if (decode($AA) == NIQ) {^EVAL ^foreach DCC.TIMEOUTS.$AA BB {^assign -DCC.TIMEOUTS[$AA][$BB]}}} ^assign -BB ^assign -NIQ } # Removes path from a filename alias dcc.nameonly {^if (match(*/* $0)) {@ FUNCTION_RETURN = mid(${rindex(/ $0)+1} 1000 $0)} {@ FUNCTION_RETURN = [$0]}} # ---------------------------------------------------------------------------- # User /msg command functions # ---------------------------------------------------------------------------- alias dcc.mcmd.version { if (index(Y $PP.SET) == [-1]) { //^notice $0 PurePak version $PPVERS DCC module echo *** $0 [$strip( $1)] requested your version } } alias dcc.mcmd.help { //^notice $0 Available DCC server commands: //^notice $0 HELP, LIST, SEND <#pack>, LSPACK <#pack>, VERSION echo *** $0 [$strip( $1)] requested DCC server help } alias dcc.mcmd.list { if (dcc.havepacks()) { //^notice $0 Files available: Type /msg $N XDCC SEND #N to get pack #N if (PP.SET.DCCLIMIT > 0) {//^notice $0 [${PP.SET.DCCLIMIT-DCC.NSENDING} slots available]} EVAL ^dcc.dolist 0 //^notice $0 echo *** $0 [$strip( $1)] requested a list of files offered } {//^notice $0 No files offered} } alias dcc.mcmd.lspack { if (DCCPACKS.FILES[$strip(# $2)]) { //^notice $0 Files in pack #$strip(# $2) @ AA = 0 while (word($AA $DCCPACKS.FILES[$strip(# $2)])) { //^notice $0 $dcc.nameonly($word($AA $DCCPACKS.FILES[$strip(# $2)])) [$dcc.getpacksize($word($AA $DCCPACKS.FILES[$strip(# $2)])) bytes] @ AA = AA + 1 } echo *** $0 [$strip( $1)] requested a list of files in pack #$strip(# $2) } {//^notice $0 There is no pack #$strip(# $2)} } @ DCC.NSENDING = 0 alias dcc.mcmd.send { if (DCCPACKS.FILES[$strip(# $2)]) { if ((DCC.NSENDING >= PP.SET.DCCLIMIT)&&(PP.SET.DCCLIMIT != [-1])) { if (PP.SET.DCCQUEUEING == [ON]) { @ ALREADY = 0 foreach DCC.SENDQUEUE AA { if ((word(0 $DCC.SENDQUEUE[$AA]) == [$0])&&(word(2 $DCC.SENDQUEUE[$AA]) == [$2])) { //^notice $0 You already have a request for pack #$strip(# $2) queued @ ALREADY = 1 } } if (!ALREADY) { @ DCC.SENDQUEUE[$time()] = [$*] echo *** DCC SEND request for pack #$strip(# $2) to $0 queued: no more slots available //^notice $0 No more DCC slots available: your request has been queued } ^assign -ALREADY } { //^notice $0 No more DCC slots available echo *** DCC SEND request for pack #$strip(# $2) to $0 denied: no more slots available } } { @ PACKNUM = strip(# $2) //^notice $0 Sending you pack #$PACKNUM \(you will need $dcc.getpacksize($DCCPACKS.FILES[$PACKNUM]) bytes\) //^notice $0 Type /dcc get $N <file> for each request received @ CTR = 0 @ AA = word(1 $DCCPACKS.STATS[$PACKNUM]) @ DCCPACKS.STATS[$PACKNUM] = [$word(0 $DCCPACKS.STATS[$PACKNUM]) ${AA+1}] while (word($CTR $DCCPACKS.FILES[$PACKNUM])) { @ AA = word($CTR $DCCPACKS.FILES[$PACKNUM]) if (!match(/* $AA)) { //^dcc close send $0 $word(0 $DCCPACKS.STATS[$PACKNUM])/$AA //^dcc send $0 $word(0 $DCCPACKS.STATS[$PACKNUM])/$AA @ SF = [$word(0 $DCCPACKS.STATS[$PACKNUM])/$AA] } { //^dcc close send $0 $AA //^dcc send $0 $AA @ SF = AA } if (PP.SET.DCCTIMEOUT > 0) {^dcc.queuetimeout $0 $dcc.nameonly($AA) $time() $SF} @ DCC.NSENDING = DCC.NSENDING + 1 if ((PP.SET.DCCLIMIT != [-1])&&(DCC.NSENDING > PP.SET.DCCLIMIT)) {@ DCC.NSENDING = PP.SET.DCCLIMIT} @ CTR = CTR + 1 } ^assign -SF ^assign -CTR echo *** DCC pack #$PACKNUM sent to $0 [$strip( $1)] ^assign -PACKNUM } } {//^notice $0 There is no pack #$strip(# $2)} } on -window "% % DCC SEND:% *completed*" {^if (DCC.NSENDING > 0) {@ DCC.NSENDING = DCC.NSENDING - 1}} on -window "% % DCC SEND:% *lost*" {^if (DCC.NSENDING > 0) {@ DCC.NSENDING = DCC.NSENDING - 1}} # ---------------------------------------------------------------------------- EVAL ^if (!PP.SET.NOSTARTUP) {/echo -- PurePak DCC server module loaded}